package com.xinyue.game.gateway.gameserver;

import com.xinyue.cross.server.client.IGameServerMessageHandler;
import com.xinyue.game.gateway.common.GameGatewayMessageResponseHeader;
import com.xinyue.game.gateway.local.UserChannelService;
import com.xinyue.game.message.GameServerMessageModel;
import com.xinyue.game.message.GameServerResponseHeader;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

@Service
public class GatewayGameServerMessageHandler implements IGameServerMessageHandler {
    private Logger logger = LoggerFactory.getLogger(GatewayGameServerMessageHandler.class);
    @Autowired
    private ApplicationContext context;

    @Override
    public void handlerMessage(GameServerMessageModel<GameServerResponseHeader> messageModel, ChannelHandlerContext serverCtx) {
        UserChannelService userChannelService = context.getBean(UserChannelService.class);
        GameServerResponseHeader responseHeader = messageModel.getHeader();
        ChannelHandlerContext ctx = userChannelService.getCtx(responseHeader.getUserKey());
        if (ctx == null) {
            logger.debug("当前用户链接已关闭，不返回消息,header: {}", responseHeader);
            return;
        }
        ByteBuf byteBuf = messageModel.getBody();
        GameGatewayMessageResponseHeader gameGatewayMessageResponseHeader = this.createResponseHeader(responseHeader);
        GameServerMessageModel<GameGatewayMessageResponseHeader> responseModel = new GameServerMessageModel<>();
        responseModel.setHeader(gameGatewayMessageResponseHeader);
        responseModel.setBody(byteBuf);
        ctx.writeAndFlush(responseModel);
    }


    private GameGatewayMessageResponseHeader createResponseHeader(GameServerResponseHeader serverResponseHeader) {
        GameGatewayMessageResponseHeader responseHeader = new GameGatewayMessageResponseHeader();
        responseHeader.setUserKey(serverResponseHeader.getUserKey());
        responseHeader.setRequestUri(serverResponseHeader.getRequestUri());
        responseHeader.setResponseTime(serverResponseHeader.getResponseTime());
        responseHeader.setRequestId(serverResponseHeader.getRequestId());
        responseHeader.setMessageType(serverResponseHeader.getMessageType());
        responseHeader.setErrorCode(serverResponseHeader.getErrorCode());
        responseHeader.setErrorMsg(serverResponseHeader.getErrorMsg());
        return responseHeader;
    }
}
